package rpt.xml;

import java.io.InputStream;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node; 
import org.dom4j.io.SAXReader;

/**
 * 
 * @author Roberto
 */
public class CLeitorXml extends CLeitor {

    /**
     * =============================================================================<p>
     */
    Document fDocumento = null;
    String fFileName = "";
    String fRoot = "//root";
    boolean fUsarAtributos = true;

    /**
     * =============================================================================<p>
     */
    public CLeitorXml(final String aNomeArquivoXml, final boolean aUsarAtributos) {
        super();
        fUsarAtributos = aUsarAtributos;
        SAXReader vReader = new SAXReader();
        try {
            this.fDocumento = vReader.read(aNomeArquivoXml);
        } catch (DocumentException ex) {
            fDocumento = null;
            Logger.getLogger(CLeitorXml.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * =============================================================================<p>
     */
    public CLeitorXml(final String aNomeArquivoXml) {
        this(aNomeArquivoXml, true);
    }

    /**
     * =============================================================================<p>
     */
    public CLeitorXml(final InputStream in) {
        super();
        SAXReader vReader = new SAXReader();
        try {
            this.fDocumento = vReader.read(in);
        } catch (DocumentException ex) {
            fDocumento = null;
            Logger.getLogger(CLeitorXml.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * =============================================================================<p>
     */
    public CLeitorXml(final Class aClasse, final String aNomeArquivoXml) {
        super();
        //
        InputStream in = aClasse.getResourceAsStream(aNomeArquivoXml);
        //
        if (in != null) {
            SAXReader vReader = new SAXReader();
            try {
                this.fDocumento = vReader.read(in);
            } catch (DocumentException ex) {
                fDocumento = null;
                Logger.getLogger(CLeitorXml.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * =============================================================================<p>
     */
    public Document getDoc() {
        return fDocumento;
    }

    /**
     * =============================================================================<p>
     */
    public Object getNodo(String aCaminho) {
        if (fDocumento == null) {
            return null;
        }
        if ((aCaminho != null) && (!aCaminho.trim().equals(""))) {
            aCaminho = "/" + aCaminho;
        }
        Object n = fDocumento.selectSingleNode(fRoot + aCaminho);
        return n;
    }

    /**
     * =============================================================================<p>
     */
    public Object getNodo(Object item, String aCaminho) {
        Node nodo = (Node)item;
        if (nodo == null) {
            return null;
        }
        if ((aCaminho != null) && (!aCaminho.trim().equals(""))) {
            nodo = nodo.selectSingleNode(aCaminho);
        }
        return nodo;
    }

    /**
     * =============================================================================<p>
     */
    @Override
    public String getStr(final String aCaminho, final String aChave) {
        Node n = (Node)getNodo(aCaminho);
        if (n == null) {
            return null;
        }
        if (fUsarAtributos) {
            Element e = (Element) n;
            Attribute a = e.attribute(aChave);
            if (a == null) {
                return null;
            } else {
                return a.getValue();
            }
        } else {
            n = n.selectSingleNode(aChave);
            if (n == null) {
                return null;
            } else {
                return n.getText();
            }
        }
    }

    /**
     * =============================================================================<p>
     */
    @Override
    public String getStr(final Object nodo, final String aCaminho, final String aChave) {
        Node n = (Node)getNodo(nodo, aCaminho);
        if (n == null) {
            return null;
        }
        if (fUsarAtributos) {
            Element e = (Element) n;
            Attribute a = e.attribute(aChave);
            if (a == null) {
                return null;
            } else {
                return a.getValue();
            }
        } else {
            n = n.selectSingleNode(aChave);
            if (n == null)
                return null;
            else
                return n.getText();
        }
    }

    /**
     * =============================================================================<p>
     */
    @Override
    public Integer getInt(final String aCaminho, final String aChave) {
        try {
            String s = getStr(aCaminho, aChave);
            if (s == null) {
                return null;
            }
            return Integer.parseInt(s);
        } catch (NumberFormatException ex) {
            Logger.getLogger("Valor inválido: aCaminho").log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * =============================================================================<p>
     */
    @Override
    public Integer getInt(final Object nodo, final String aCaminho, final String aChave) {
        try {
            String s = getStr(nodo, aCaminho, aChave);
            if (s == null) {
                return null;
            }
            return Integer.parseInt(s);
        } catch (NumberFormatException ex) {
            Logger.getLogger("Valor inválido: aCaminho").log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * =============================================================================<p>
     */
    @Override
    public Float getFloat(final String aCaminho, final String aChave) {
        try {
            String s = getStr(aCaminho, aChave);
            if (s == null) {
                return null;
            }
            return Float.parseFloat(s);
        } catch (NumberFormatException ex) {
            Logger.getLogger("Valor inválido: aCaminho").log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * =============================================================================<p>
     */
    @Override
    public Float getFloat(final Object nodo, final String aCaminho, final String aChave) {
        try {
            String s = getStr(nodo, aCaminho, aChave);
            if (s == null) {
                return null;
            }
            return Float.parseFloat(s);
        } catch (NumberFormatException ex) {
            Logger.getLogger("Valor inválido: aCaminho").log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * =============================================================================<p>
     */
    @Override
    public List<? extends Object> getItens(
            final String aCaminho) {
        Element ele = null;
        List<? extends Object> nl = fDocumento.selectNodes(fRoot + "/" + aCaminho);
        return nl;
    }

    /**
     * =============================================================================<p>
     */
    @Override
    public List<? extends Object> getItens(
            final Object node,
            final String aCaminho) {
        Element ele = null;
        List<? extends Object> nl = fDocumento.selectNodes(fRoot + "/" + aCaminho);
        return nl;
    }
    /**
     * =============================================================================<p>
     */
}
